#ifndef _Circulo_h
#define _Circulo_h
#include <iostream>
using namespace std;
#include "Coordenada.h"
#include "Figura2D.h"
#include "ExcepcionSVG.h"

/** \file Circulo.h
* \brief Clase Circulo.
*
* Definicion de clase Circulo.
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/

/** \brief Clase Circulo, define el comportamiento de esta clase.
 *
 * Clase que define los métodos y funciones asociados a esta.
 */
class Circulo : public Figura2D
{

	/** \brief Sobrecarga del operador "<<".
	*
	* Este método nos devuelve un ostream& en el que hemos escrito una salida según el formato svg, que hemos dispuesto.
	* \param os Tipo ostream&.
	* \param c Tipo Circulo &.
	* \return El método devuelve un ostream&.
	*/
	friend ostream& operator<<(ostream& , const Circulo& );

	public:

		/** \brief Constructor de objeto Circulo.
		*
		* Pasamos tres argumentos, un objeto Coordenada pcentro, para definer el centro del circulo, un float pradio para el radio.
		* Estos valores se encuentran definidos por defecto a su vez.
		* \param pcentro de tipo Coordenada.
		* \param pradio de tipo float
		* \param grosor de tipo int
		* \param fondo de tipo Color
		* \param linea de tipo Color
		*/
		Circulo( Coordenada pcentro = Coordenada(0,0) , float pradio = 1.0, int grosor=1, Color fondo=black, Color linea=none);

		/** \brief Constructor de copia.
		*
		* Pasado un objeto crea uno igual a este sin alterarlo.
		* \param c Un objeto de tipo const Circulo&.
		*/
		Circulo( const Circulo&);

		/** \brief Destructor de objetos Circulo.
		*
		* Se ejecuta cuando hace falta destruir un objeto, asignando a sus partes valores 0.
		*/
		~Circulo();

		/** \brief Sobrecarga del operador "=".
		*
		* Mediante este método, copiamos el contenido de un objeto circulo "c" a el que queramos.
		* \param c Tipo const Circulo.
		* \return El método devuelve un objeto Circulo.
		*/
		Circulo& operator=( const Circulo&);

		/** \brief getCentro.
		*
		* Este método devuelve el valor del atributo centro de la clase Circulo.
		*
		* \return El método devuelve un objeto Coordenada.
		*/
		Coordenada getCentro() const;

		/** \brief getRadio().
		*
		* Este método nos devuelve el valor del atributo radio de nuestro objeto.
		*
		* \return El método devuelve un float.
		*/
		float getRadio() const;

		/** \brief setRadio().
		*
		* Este método nos permite modificar el valor del radio del objeto que lo llame.
		* \param pradio tipo float.
		* \return El método no devuelve nada.
		*/
		void setRadio(float);

		/** \brief pintar.
		*
		* Este método recibe un parámetro os tipo ostream mediante el cual efectúa la salida en el formato que queremos.
		* \param os tipo ostream&.
		* \return El método no devuelve nada.
		*/
		void pintar(ostream&) const;

		/** \brief leeEntrada().
		*
		* Este método procesa la linea del fichero para rellenar los datos de un Circulo.
		* \param is flujo de entrada.
		* \return El método no devuelve nada.
		*/
		void leeEntrada(istream&);

		/** \brief clonar().
		*
		* Este método crea una figura Circulo clonica al original.
		* \return El método devuelve un puntero a ese objeto clonico.
		*/
		Circulo* clonar() const;

		/** \brief escalar().
		*
		* Este método eleva el radio de la figura Circulo.
		* \param porcentaje cuanto debe de ser elevado el radio.
		* \return El método no devuelve nada.
		*/
		void escalar(float porcentaje=100.0);		

	private:

		/** \brief Variable tipo float "radio";
		 *
		 *	La variable radio expresa cuantitavimente el tamaño en número real del radio del objeto criculo del que forma parte.
		 */
		float radio;

		/** \brief Variable tipo "Coordenada";
		 *
		 *	La variable centro lleva dos coordenadas X e Y que representan la posicion de la figura en el lienzo.
		 */
		Coordenada centro;
		
};


#endif
